#include "phoneloginwidget.h"
#include"loginwidget.h"
#include"./model/datacenter.h"
#include"toast.h"
#include"./mainwidget.h"

#include<QGridLayout>
#include<QLabel>
#include<QPushButton>
#include<QLineEdit>
#include<QTimer>

PhoneLoginWidget::PhoneLoginWidget(QWidget *parent)
    : QWidget{parent}
{
    //1.设置窗口的基本属性
    this->setFixedSize(400,350);
    this->setWindowTitle("登录");
    this->setWindowIcon(QIcon(":/resource/image/logo.png"));
    this->setStyleSheet("QWidget { background-color: rgb(255,255,255); }");
    this->setAttribute(Qt::WA_DeleteOnClose);

    //2.创建核心布局管理器
    QGridLayout* layout = new QGridLayout();
    layout->setSpacing(10);
    layout->setContentsMargins(50,0,50,0);
    this->setLayout(layout);

    //3.创建标题
    titleLabel = new QLabel();
    titleLabel->setText("登录");
    titleLabel->setFixedHeight(50);
    titleLabel->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
    titleLabel->setStyleSheet("QLabel { font-size: 40px; font-weight: 600;}");
    titleLabel->setAlignment(Qt::AlignCenter);

    //4.创建手机号输入框
    QString editStyle = "QLineEdit { border: none;border-radius: 10px; font-size: 20px; background-color: rgb(240,240,240);padding-left:5px;}";
    phoneEdit = new QLineEdit();
    phoneEdit->setPlaceholderText("输入手机号");
    phoneEdit->setFixedHeight(40);
    phoneEdit->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
    phoneEdit->setStyleSheet(editStyle);
    phoneEdit->setValidator(new QRegularExpressionValidator(QRegularExpression("^1\\d{10}$")));

    //5.创建验证码输入框
    verifyCodeEdit = new QLineEdit();
    verifyCodeEdit->setPlaceholderText("输入短信验证码");
    verifyCodeEdit->setFixedHeight(40);
    verifyCodeEdit->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
    verifyCodeEdit->setStyleSheet(editStyle);

    //6.创建发送验证码按钮
    QString btnWhiteStyle = "QPushButton { border: none; border-radius: 10px; background-color: transparent;}";
    btnWhiteStyle += "QPushButton:pressed { background-color: rgb(240,240,240)}";
    sendVerifyCodeBtn = new QPushButton();
    sendVerifyCodeBtn->setFixedSize(100,40);
    sendVerifyCodeBtn->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
    sendVerifyCodeBtn->setText("发送验证码");
    sendVerifyCodeBtn->setStyleSheet(btnWhiteStyle);

    //7.创建提交按钮
    submitBtn = new QPushButton();
    submitBtn->setFixedHeight(40);
    submitBtn->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
    submitBtn->setText("登录");
    QString btnGreenStyle = "QPushButton { border: none; border-radius: 10px;background-color: rgb(44,182,61);color: rgb(255,255,255);}";
    btnGreenStyle += "QPushButton:pressed { background-color: rgb(240,240,240);}";
    submitBtn->setStyleSheet(btnGreenStyle);

    //8.创建"切换到用户名"模式按钮
    userModeBtn = new QPushButton();
    userModeBtn->setFixedSize(100,40);
    userModeBtn->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
    userModeBtn->setText("切换到用户名");
    userModeBtn->setStyleSheet(btnWhiteStyle);

    //9.切换到登录注册模式
    switchModeBtn = new QPushButton();
    switchModeBtn->setFixedSize(40,40);
    switchModeBtn->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
    switchModeBtn->setText("注册");
    switchModeBtn->setStyleSheet(btnWhiteStyle);

    //10.添加到布局管理器
    layout->addWidget(titleLabel,0,0,1,5);
    layout->addWidget(phoneEdit,1,0,1,5);
    layout->addWidget(verifyCodeEdit,2,0,1,4);
    layout->addWidget(sendVerifyCodeBtn,2,4,1,1);
    layout->addWidget(submitBtn,3,0,1,5);
    layout->addWidget(userModeBtn,4,0,1,1);
    layout->addWidget(switchModeBtn,4,4,1,1);

    //12.处理信号槽
    connect(switchModeBtn,&QPushButton::clicked,this,&PhoneLoginWidget::switchMode);

    connect(userModeBtn,&QPushButton::clicked,this,[=](){
        LoginWidget* loginWidget = new LoginWidget();
        loginWidget->show();

        //关掉当前窗口
        this->close();
    });

    connect(sendVerifyCodeBtn,&QPushButton::clicked,this,&PhoneLoginWidget::sendVerifyCode);

    timer = new QTimer(this);
    connect(timer,&QTimer::timeout,this,&PhoneLoginWidget::countDown);

    connect(submitBtn,&QPushButton::clicked,this,&PhoneLoginWidget::clickSubmitBtn);
}

void PhoneLoginWidget::sendVerifyCode()
{

    //1.获取到手机号码
    const QString& phone = this->phoneEdit->text();
   if(phone.isEmpty()){
        return ;
   }
    //2.判定手机号是否合法
   int pos = 0;
   QString content = phone;
   if(phoneEdit->validator()->validate(content,pos) != QValidator::Acceptable){
       Toast::showMessage("输入的手机号非法,请重新输入!");
       phoneEdit->clear();
       return;
   }

   this->currentPhone = phone;

   //3.发送网络请求,获取验证码
   model::DataCenter* dataCenter = model::DataCenter::getInstance();
   connect(dataCenter,&model::DataCenter::getVerifyCodeDone,this,&PhoneLoginWidget::sendVerifyCodeDone,Qt::UniqueConnection);
   dataCenter->getVerifyCodeAsync(phone);
}

void PhoneLoginWidget::sendVerifyCodeDone()
{
    Toast::showMessage("验证码已经发送");
}

void PhoneLoginWidget::phoneLoginDone(bool ok, const QString &reason)
{
    if(!ok){
        Toast::showMessage("登录失败!" + reason);
    }

    //跳转到主窗口
    MainWidget* mainWidget = MainWidget::getInstance();
    mainWidget->show();
    //关闭自己
    this->close();
}

void PhoneLoginWidget::phoneRegisterDone(bool ok, const QString &reason)
{
    //是否注册成功
    if(!ok){
        Toast::showMessage("注册成功!");
        return;
    }
    Toast::showMessage("注册成功!");

    //跳转到登录界面
    switchMode();

    //处理一下倒计时的按钮
    leftTime = 1;
}


void PhoneLoginWidget::clickSubmitBtn()
{
    //1.从输入框中拿到必要的内容
    //	此处不要从输入框直接拿电话,可能用户故意搞事情,输入验证码的时候,输入的电话是1，点击提交的时候，输入的是电话2;
    const QString& phone = this->currentPhone;
    const QString& verifyCode = verifyCodeEdit->text();
    if(phone.isEmpty() || verifyCode.isEmpty()){
        Toast::showMessage("电话或者验证码不应该为空");
        return ;
    }

    //2.发送请求
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    if(isLoginMode){
        //登录
        connect(dataCenter,&model::DataCenter::phoneLoginDone,this,&PhoneLoginWidget::phoneLoginDone,Qt::UniqueConnection);
        dataCenter->phoneLoginAsync(phone,verifyCode);
    }else{
        //注册
        connect(dataCenter,&model::DataCenter::phoneRegisterDone,this,&PhoneLoginWidget::phoneRegisterDone,Qt::UniqueConnection);
        dataCenter->phoneRegisterAsync(phone,verifyCode);
    }

}

void PhoneLoginWidget::countDown()
{
    if(leftTime <= 1){
        //时间到,发送按钮设为可用状态,并且停止定时器
        sendVerifyCodeBtn->setEnabled(true);
        sendVerifyCodeBtn->setText("发送验证码");
        timer->stop();
        leftTime = 30;
        return;
    }

    leftTime -= 1;
    sendVerifyCodeBtn->setText(QString::number(leftTime) + "s");
    if(sendVerifyCodeBtn->isEnabled()){
        sendVerifyCodeBtn->setEnabled(false);
    }
}

void PhoneLoginWidget::switchMode()
{
        if(isLoginMode){
            //当前是登录模式，切换到注册模式
            this->setWindowTitle("注册");
            titleLabel->setText("注册");
            submitBtn->setText("注册");
            submitBtn->setText("手机号注册");
            switchModeBtn->setText("登录");
        }
        else{
            //当前是注册模式，切换到登录模式
            this->setWindowTitle("登录");
            titleLabel->setText("登录");
            submitBtn->setText("登录");
            submitBtn->setText("手机号登录");
            switchModeBtn->setText("注册");
        }
        isLoginMode =!isLoginMode;

}
